03 文件也有身份证 - MD5 和 SHA256
一个实际场景
从网上下载了一个安装包,但是安装出错,想要确实是不是安装包下载不完整;
- 如何进行文件一致性校验
- 充分利用内容的哈希值信息
- 一般镜像下载网站均会提供文件的 MD5 值或 SHA256 值
什么是哈希值
用于唯一标识数据的固定长度的数字值,能够以较小内容表征大量内容;
- 常以 2^n 次方 0/1-bit 表征哈希值;
- 通常用于验证通过不安全通道发送的数据的完整性;
- MD5 和 SHA256 是两种常用的哈希算法;
MD5 (Message Digest Algorithm 5)
MD5 是一种广泛使用的哈希函数,能够生成一个 128 位的哈希值(通常表示为 32 个十六进制字符)。尽管 MD5 在过去被广泛使用,但由于其安全性问题(容易受到碰撞攻击),现在通常不推荐用于安全敏感的应用。
SHA-256 (Secure Hash Algorithm 256-bit)
SHA-256 是 SHA-2 系列中的一种哈希算法,能够生成一个 256 位的哈希值(通常表示为 64 个十六进制字符)。SHA-256 被认为是目前最安全的哈希算法之一,广泛用于加密和数据完整性验证。
MD5 和 SHA256 的异同
- 相同点
- 常用于数字签名、数据完整性检查和密码学应用;
- 单向哈希,无法从结果反推原始数据;
- 同一文件生成的值相同;
- 不同点
- MD5 的哈希值长度为 128 位,SHA256 的哈希值长度为 256 位;
- MD5 值的计算速度更快,SHA256 值的安全性更高;
MD5 的计算原理
- 将文件内容转换为二进制;
- 对文件内容进行填充,使长度为 (512m+448)-bit;
- 将填充后的文件内容进行分块处理;
- 基于逻辑运算、位运算和加法运算的 64 轮迭代哈希值计算;
- 将 128 位二进制哈希值转换为 32 位十六进制数值输出;
Linux 计算哈希值
- MD5 值计算方法:
md5sum [文件名] - SHA256 值计算方法:
sha256sum [文件名] - 输出为该文件的哈希值信息
-c:从文件中读取 MD5/SHA256 哈希值,并检查文件的完整性。
bash
➜ ~ md5sum lol.exe # 计算 lol.exe 文件的 MD5 值
d41d8cd98f00b204e9800998ecf8427e lol.exe
➜ ~ sha256sum lol.exe # 计算 lol.exe 文件的 SHA256 值
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 lol.exeWindows 计算哈希值
Get-FileHash (Microsoft.PowerShell.Utility) - PowerShell | Microsoft Learn
- 计算 MD5 值:
Get-FileHash -Path [文件名] -Algorithm MD5 - 计算 SHA256 值:
Get-FileHash -Path [文件名] -Algorithm SHA256 - 输出为该文件的哈希值信息
powershell
> Get-FileHash /etc/apt/sources.list | Format-List
Algorithm : SHA256
Hash : 3CBCFDDEC145E3382D592266BE193E5BE53443138EE6AB6CA09FF20DF609E268
Path : /etc/apt/sources.list
> Get-FileHash -Path lol.exe -Algorithm MD5 | Format-List
Algorithm : MD5
Hash : D41D8CD98F00B204E9800998ECF8427E
Path : lol.exe
> Get-FileHash -Path lol.exe -Algorithm SHA256 | Format-List
Algorithm : SHA256
Hash : E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
Path : lol.exe比较 MD5 和 SHA-256
- 安全性:SHA-256 比 MD5 更安全,因为 SHA-256 的哈希值更长,且更难受到碰撞攻击。
- 性能:MD5 的计算速度通常比 SHA-256 快,但在现代硬件上,这种差异通常可以忽略不计。
- 应用场景:对于安全敏感的应用(如密码存储、数字签名等),应使用 SHA-256 或更强的哈希算法。对于非安全敏感的应用(如数据完整性验证),MD5 仍然可以使用,但应谨慎考虑其安全性问题。
MD5 唯一吗
不唯一。原理分析:
- MD5 是一个 128-bit 0/1 字符串,总共存在 2^128 种可能值;
- 计算机上不同内容的文件数量无穷多
- 存在多对一的映射,因此理论上,存在不同文件内容具有相同 MD5 值的情况;
MD5 可用吗
可用。原理分析:
- 任意找两个文件,两者 MD5 值相同的概率几乎为 0,在实际应用中,可认为 MD5 值相同即为同一文件;
- 相比 MD5 算法,SHA256 的安全性更高,在高安全性场景下,推荐使用 SHA256;
总结
- MD5:生成 128 位哈希值,速度快,但安全性较低,不推荐用于安全敏感的应用。
- SHA-256:生成 256 位哈希值,安全性高,广泛用于加密和数据完整性验证。
bash
➜ ~ md5sum motrix.reg # 计算 motrix.reg 文件的 MD5 值
d29bc55f07c13925fc8e8599cfd824ce motrix.reg
➜ ~ md5sum motrix.reg > motrix.reg.md5 # 将 motrix.reg 文件的 MD5 值输出到 motrix.reg.md5 文件
➜ ~ md5sum -c motrix.reg.md5 # 验证 motrix.reg 文件的 MD5 值是否正确
motrix.reg: OK
➜ ~ echo "newline" >> motrix.reg # 在 motrix.reg 文件的末尾添加 newline 内容
➜ ~ md5sum -c motrix.reg.md5 # 再次验证 motrix.reg 文件的 MD5 值是否正确,发现不一致
motrix.reg: FAILED
md5sum: WARNING: 1 computed checksum did NOT matchbash
➜ ~ sha256sum motrix.reg # 计算 motrix.reg 文件的 SHA256 值
70199c2823d86790e3034af0f0c6a82426206a69d33e0c193609ac8c5c10dad9 motrix.reg
➜ ~ sha256sum motrix.reg > motrix.reg.sha256 # 将 motrix.reg 文件的 SHA256 值输出到 motrix.reg.sha256 文件
➜ ~ sha256sum -c motrix.reg.sha256 # 验证 motrix.reg 文件的 SHA256 值是否正确
motrix.reg: OK
➜ ~ sed -i 's/newline//' motrix.reg # 删除 motrix.reg 文件的 newline 内容
➜ ~ sha256sum -c motrix.reg.sha256 # 再次验证 motrix.reg 文件的 SHA256 值是否正确,发现不一致
motrix.reg: FAILED
sha256sum: WARNING: 1 computed checksum did NOT matchpowershell
~\Desktop
❯ get-filehash .\motrix.reg -Algorithm md5 | Format-List
Algorithm : MD5
Hash : D29BC55F07C13925FC8E8599CFD824CE
Path : C:\Users\Administrator\Desktop\motrix.reg
~\Desktop
❯ get-filehash .\motrix.reg -Algorithm sha256 | Format-List
Algorithm : SHA256
Hash : 8C3F6F7ACD49069776CE47AA331EB058549FE9A8BA70C7387AEE63CD437B80D1
Path : C:\Users\Administrator\Desktop\motrix.reg